package org.jeecg.modules.wflow.workflow.service;

import org.jeecg.modules.wflow.workflow.bean.process.ProcessNode;
import org.jeecg.modules.wflow.workflow.bean.process.form.Form;
import org.jeecg.modules.wflow.workflow.bean.process.props.RootProps;

import java.util.List;
import java.util.Map;

/**
 * @author : willian fu
 * @date : 2022/8/24
 */

public interface FormService {

    /**
     * 通过流程实例获取所有的表单数据
     * @param instanceId 实例ID
     * @return 表单map数据
     */
    Map<String, Object> getProcessInstanceFormData(String instanceId);

    /**
     * 通过流程实例模糊查询获取表单数据
     * @param instanceId 实例ID
     * @param likeName 模糊查询字段名
     * @return 表单字段数据值
     */
    Map<String, Object> getProcessInstanceFormDataLike(String instanceId, String likeName);

    /**
     * 通过流程实例获取表单单个字段数据
     * @param instanceId 实例ID
     * @param fieldName 字段名
     * @return 表单字段数据值
     */
    Object getProcessInstanceFormDataSingle(String instanceId, String fieldName);

    /**
     * 通过流程实例获取单个表单字段数据
     * @param instanceId 实例ID
     * @param fieldName 字段名
     * @param clazz 字段类型
     * @return 表单字段数据值
     */
    <T> T getProcessInstanceFormDataSingleByType(String instanceId, String fieldName, Class<T> clazz);

    /**
     * 获取发起人节点的表单渲染配置
     * @param forms 全量表单
     * @param rootProps 发起人节点配置
     * @return 发起人表单配置
     */
    List<Form> filterFormByPermConfigForRoot(List<Form> forms, RootProps rootProps);

    /**
     * 更新流程实例表单数据
     * @param instanceId 实例ID
     * @param formData 表单数据
     */
    void updateInstanceFormData(String instanceId, Map<String, Object> formData);

    /**
     * 通过流程编码获取当前节点可见的表单渲染配置
     * @param currentNode 当前节点（审批、抄送）
     * @param code 流程编号
     * @return 可见的表单项
     */
    @Deprecated
    List<Form> getFormsByProcessCodeFilterPerm(String currentNode, String code);

    /**
     * 加载表单权限，隐藏项将被过滤
     * @param forms 表单配置
     * @param formData 表单数据
     * @param currentNode 节点配置
     * @return 所有只读表单
     */
    List<Form> filterFormAndDataByPermConfig(List<Form> forms, Map<String, Object> formData, ProcessNode<?> currentNode);
}
